/*题目：输入任意多行字符串（总共不超过100个字符），把其中所有小写字母换成大写字母，
其他不变，当到达文件末尾EOF时一次性全部转换。 (考虑先实现一个lower2Upper函数，
其将传递过来的字符数组，在函数内部执行小写转大写功能)	
输入样例：		
ABcDEfgH
China
输出样例：
ABCDEFGH
CHINA
*/
#include <stdio.h>  
#include <ctype.h>  
#include <string.h>  
  
#define TOTAL_SIZE 100 // 假设输入总共不超过100个字符（包括换行符）  
  
void lower2Upper(char* str);  
  
int main() {  
    char buffer[TOTAL_SIZE + 1] = {0}; // 初始化数组，多一个字节用于字符串结束符'\0'  
    int current_index = 0; // 当前要写入的索引位置  
    int total_chars = 0; // 已经读取的字符总数（包括换行符）  
  
    // 读取所有行，直到EOF，并且确保总字符数不超过TOTAL_SIZE  
    while (fgets(buffer + current_index, TOTAL_SIZE - current_index, stdin) != NULL) {  
        total_chars += strlen(buffer + current_index); // 更新已读取字符数  
        if (total_chars > TOTAL_SIZE) { // 如果超过100个字符，则停止读取  
            break;  
        }  
  
        // 检查是否读取到了换行符，并且不是最后一行（因为最后一行可能没有换行符）  
        if (strchr(buffer + current_index, '\n') != NULL && fgets(buffer + current_index + strlen(buffer + current_index), 1, stdin) == NULL) {  
            // 移除最后一个换行符（因为我们要在输出时手动添加）  
            buffer[strlen(buffer) - 1] = '\0';  
        }  
  
        // 移动到下一个可写入的位置（跳过已经写入的字符串和它的结束符'\0'）  
        current_index = strlen(buffer);  
    }  
  
    // 将整个buffer的内容转换为大写  
    lower2Upper(buffer);  
  
    // 打印转换后的大写字符串，并在每行末尾添加换行符（除了最后一行）  
    char *token = strtok(buffer, "\n");  
    while (token != NULL) {  
        printf("%s\n", token); // 输出当前行并添加换行符  
        token = strtok(NULL, "\n"); // 获取下一行  
    }  
  
    return 0;  
}  
  
void lower2Upper(char* str) {  
    while (*str) {  
        if (*str >= 'a' && *str <= 'z') {  
            *str = *str - 'a' + 'A';  
        }  
        str++;  
    }  
}